package com.example.user.adapter.in.web.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import lombok.Data;

/**
 * 用户注册请求DTO (Data Transfer Object)
 * 用于封装用户注册时提交的数据
 * 
 * DTO是数据传输对象，主要用于在不同层之间传输数据
 * 这里专门用于接收用户注册请求的数据
 * 
 * @Data Lombok注解，自动生成getter、setter、toString等方法
 * @Schema Swagger注解，用于API文档生成，描述这个类的作用
 */
@Data
@Schema(description = "用户注册请求")
public class RegisterRequest {

    /**
     * 用户名字段
     * 
     * @NotBlank 验证注解，确保用户名不为空且去除空格后不为空
     * @Size 验证注解，限制用户名长度在3-20个字符之间
     * @Pattern 验证注解，使用正则表达式限制用户名只能包含字母、数字和下划线
     * regexp 属性定义了正则表达式规则：^[a-zA-Z0-9_]+$
     * ^ 表示字符串开始
     * [a-zA-Z0-9_] 表示字符可以是字母、数字或下划线
     * + 表示前面的字符可以出现一次或多次
     * $ 表示字符串结束
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在3-20个字符之间")
    @Pattern(regexp = "^[a-zA-Z0-9_]+$", message = "用户名只能包含字母、数字和下划线")
    @Schema(description = "用户名", example = "testuser")
    private String username;

    /**
     * 密码字段
     * 
     * @NotBlank 验证注解，确保密码不为空且去除空格后不为空
     * @Size 验证注解，限制密码长度在6-20个字符之间
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 20, message = "密码长度必须在6-20个字符之间")
    @Schema(description = "密码", example = "123456")
    private String password;

    /**
     * 确认密码字段
     * 
     * @NotBlank 验证注解，确保确认密码不为空且去除空格后不为空
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @NotBlank(message = "确认密码不能为空")
    @Schema(description = "确认密码", example = "123456")
    private String confirmPassword;

    /**
     * 邮箱字段
     * 
     * @Email 验证注解，确保邮箱格式正确
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @Email(message = "邮箱格式不正确")
    @Schema(description = "邮箱", example = "test@example.com")
    private String email;

    /**
     * 手机号字段
     * 
     * @Pattern 验证注解，使用正则表达式验证手机号格式
     * regexp 属性定义了手机号的正则表达式规则：^1[3-9]\d{9}$
     * ^ 表示字符串开始
     * 1 表示手机号必须以1开头
     * [3-9] 表示第二位数字必须是3-9之间的数字
     * \d{9} 表示后面必须跟9个数字
     * $ 表示字符串结束
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @Schema(description = "手机号", example = "13800138000")
    private String phone;

    /**
     * 真实姓名字段
     * 
     * 这个字段没有强制验证注解，是可选填写的
     * @Schema Swagger注解，用于API文档生成，描述字段的作用和示例值
     */
    @Schema(description = "真实姓名", example = "张三")
    private String realName;
}